﻿    using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SIBI.Models;

namespace SIBI.Controllers
{
    [Authorize]
    public class MarcaController : Controller
    {
        private SIBIContext db = new SIBIContext();

        //***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Index()													 						*//
		// Función que devuelve la vista de todos los ítems de Marca listados en la 		*//
		// pantalla.																		*//
		// _________________________________________________________________________________*//
		// Entrada: None                                        							*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los Marca listados.								*//
		// _________________________________________________________________________________*//
        public ViewResult Index()
        {
            return View(db.Marcas.ToList());
        }

		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Details()	Acceso INVITADO	y ADMINISTRADOR										*//
		// Función que devuelve la vista de los detalles de una Marca especificada.	 		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador de la Marca que se desea ver los detalles. 				*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los datos de la Marca desado.						*//
		// _________________________________________________________________________________*//
        public ViewResult Details(int id)
        {
            Marca marca = db.Marcas.Find(id);
            return View(marca);
        }

		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Create()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite crear una Marca especificada. Método GET*//
		// _________________________________________________________________________________*//
		// Entrada: 		none															*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para crear la Marca desada.				*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Create()
        {
            return View();
        } 
       
		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Create()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista q permite crear una Marca especificada. Método POST	*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	marca: dato de tipo modelo, que representa una marca, este es requerido para*//
		//		verificar que los datos suministrados son correctos,  para así crear o 		*//
		//		enviar un mensaje de error en la aplicación. 								*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve la marca creada.										*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Create(Marca marca)
        {
            var validMarca= (from m in db.Marcas
                            where m.cnom == marca.cnom
                            select m.cnom).ToList();

            if (validMarca.Count() == 0)
            {
                if (ModelState.IsValid)
                {
                    db.Marcas.Add(marca);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            else
                ViewBag.DuplicateMarca = "Marca Duplicada";

            return View(marca);
        }

		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Edit()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista q permite Editar una Marca especificada. Método GET	*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador de la Marca que se desea editar.							*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para Editar la Marca desada.				*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Edit(int id)
        {
            Marca marca = db.Marcas.Find(id);
            return View(marca);
        }
       
		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Create()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista q permite crear una Marca especificada. Método POST	*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	marca: dato de tipo modelo, que representa una marca, este es requerido para*//
		//		verificar que los datos suministrados son correctos,  para así editar o 	*//
		//		enviar un mensaje de error en la aplicación. 								*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve la marca editada.									*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Edit(Marca marca)
        {
            if (ModelState.IsValid)
            {
                db.Entry(marca).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View(marca);
        }

		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Delete()	Acceso solo ADMINISTRADOR												*//
		// Acción q devuelve la vista q permite Eliminar una Marca especificada. Método GET	*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador de la Marca que se desea Eliminar.						*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para Eliminar la Marca desada.				*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Delete(int id)
        {
            Marca marca = db.Marcas.Find(id);
            return View(marca);
        }
		
		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// DeleteConfirmed()	Acceso solo ADMINISTRADOR									*//
		// Acción que devuelve la vista que permite elimininar una Marca especificada. 		*//
		// Método POST.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador de la Marca que va a eliminar.							*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que muestra la eliminación de la Marca desada.					*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {            
            Marca marca = db.Marcas.Find(id);

            var marcamodelo = from m in db.MarcaModeloes
                                  where m.MarcaId == marca.MarcaId
                                  select m.MarcaModeloId;
            if (marcamodelo.FirstOrDefault() == 0)
            {
                db.Marcas.Remove(marca);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            else
            {
                return RedirectToAction("Confirmacion");
            }

        }
		
		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Confirmacion()	Acceso solo ADMINISTRADOR										*//
		// Acción que devuelve la vista que informa si la Marca esta asociada a algúna 		*//
		// MarcaModelo.	Método GET.															*//
		// _________________________________________________________________________________*//
		// Entrada: 	none																*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve la pantalla de asociación a una MarcaModelo.			*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ViewResult Confirmacion()
        {
            return View();
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}